package com.sky.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
@Slf4j
public class RedisConfiguration {

    // RedisConnectionFactory 是通过引入的Redis的starter 来获得的，
    // 前提是需要加上@Bean注解进行注入
    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
//        // 创建RedisTemplate对象
//        RedisTemplate<String, Object> template = new RedisTemplate<>();
//        // 设置连接工厂
//        template.setConnectionFactory(redisConnectionFactory);
//        // 创建JSON序列化工具
//        GenericJackson2JsonRedisSerializer jsonRedisSerializer =
//                new GenericJackson2JsonRedisSerializer();
//        // key和hashKey采用string序列化
//        template.setKeySerializer(RedisSerializer.string());
//        template.setHashKeySerializer(RedisSerializer.string());
//        // value和hashValue采用json序列化
//        template.setValueSerializer(jsonRedisSerializer);
//        template.setHashValueSerializer(jsonRedisSerializer);
//        // 返回
//        return template;

        log.info("开始创建redis模板对象...");
        RedisTemplate redisTemplate = new RedisTemplate();
        //设置redis的连接工厂对象
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //设置redis key的序列化器
        // 不指定序列化器，key的显示会导致中文看不到真实值
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        return redisTemplate;
    }
    /*
     上面的方式序列化器有缺点：
     为了在反序列化时知道对象的类型，JSON序列化器会将类的class类型写入json结果中，存入Redis，会带来额外的内存开销。

      可以使用stringRedisTemplate
     */



}